home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PsL Monthly 1993 December
/
PSL Monthly Shareware CD-ROM (December 1993).iso
/
prgmming
/
dos
/
c
/
stdlib1.exe
/
lha
/
STRICMPL.ASM
< prev
next >
Wrap
Assembly Source File
|
1990-05-31
|
3KB
|
128 lines
stdlib segment para public 'slcode'
assume cs:stdlib
;
extrn $uprtbl:byte
;
; strcmpl- Compares the string pointed at by es:si to the string following
; the call instruction.
;
; inputs:
;
; es:si- First string (The string to compare)
; cs:rtn- Second string (The string to compare against)
;
; e.g.,
; "if (es:si < cs:rtn) then ..."
;
; returns:
;
; ax- index into strings where they differ (points at the zero byte
; if the two strings are equal).
;
; Condition codes set according to the string comparison. You should
; use the unsigned branches (ja, jb, je, etc.) after calling this
; routine.
;
public sl_stricmpl
;
sl_stricmpl proc far
push bp
mov bp, sp
push es
push ds
push bx
push cx
push si
push di
mov ax, es
mov ds, ax
les di, 2[bp]
lea bx, $uprtbl
;
; In order to preserve the direction flag across this call, we have to
; test whether or not it is set here and execute two completely separate
; pieces of code (so we know which state to exit in. Unfortunately, we
; cannot use pushf to preserve this flag since we need to return status
; info in the other flags.
;
pushf
pop ax
test ah, 4 ;Test direction bit.
jnz DirIsSet
;
; Compute the length of the string following the CALL instruction:
;
cld
mov al, 0
mov cx, 0ffffh
repne scasb
xchg di, 2[bp] ;Save as new return address.
;
xor cx, cx ;Set char index to zero.
sclp: lodsb
xlat cs:$uprtbl
mov ah, al
mov al, es:[di]
xlat cs:$uprtbl
cmp ah, al
jne scNE ;If strings are <>, quit.
inc cx ;Increment index into strs.
inc di ;Incrment str2 ptr.
cmp al, 0 ;Check for end of strings.
jne sclp
pushf
dec cx
popf
;
scNE: mov ax, cx
pop di
pop si
pop cx
pop bx
pop ds
pop es
pop bp
ret ;Return with direction flag clear.
;
;
DirIsSet: cld
mov al, 0
mov cx, 0ffffh
repne scasb
xchg di, 2[bp] ;Save as new return address.
;
xor cx, cx ;Set char index to zero.
sclp2: lodsb
xlat cs:$uprtbl
mov ah, al
mov al, es:[di]
xlat cs:$uprtbl
cmp ah, al
jne scNE2 ;If strings are <>, quit.
inc cx ;Increment index into strs.
inc di ;Incrment str2 ptr.
cmp al, 0 ;Check for end of strings.
jne sclp2
pushf
dec cx
popf
;
scNE2: mov ax, cx
pop di
pop si
pop cx
pop bx
pop ds
pop es
pop bp
std
ret ;Return with direction flag set.
;
;
;
sl_stricmpl endp
;
;
stdlib ends
end